package com.xpert.common;

import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.DecimalFormat;
import java.util.Calendar;
import java.util.regex.Pattern;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class Util {

    /**
  * 작성할 format을 받아서 양식에 맞는 숫자 포맷을 리턴한다.
  * @param  int d
  * @param  long theNum
  * @return formatted numeric string
  */
  public String formatNumber(int d, long theNum) {
    String str = "";
    String temp = "";
    
    try {
        for(int i = 0; i < d; i++) {
        	str = str + "0";
        }

      DecimalFormat decimal = new DecimalFormat(str);
      temp = decimal.format(theNum);
    }
    catch(Exception e) { }
    
    return temp;
  }
	
  /**
  * 작성할 format을 받아서 양식에 맞는 숫자 포맷을 리턴한다.
  * @param  int d
  * @param  int theNum
  * @return formatted numeric string
  */
  public String formatNumber(int d, int theNum) {
    String str = "";
    String temp = "";
    
    try {
        for(int i = 0; i < d; i++) {
    	str = str + "0";
        }
    
        DecimalFormat decimal = new DecimalFormat(str);
        temp = decimal.format(theNum);
    }
    catch(Exception e) { }
    return temp;
  }

  /**
  * 작성할 format을 받아서 양식에 맞는 공백 포맷을 리턴한다.
  * @param  int d
  * @param  String str
  * @return empty string
  */
  public String formatString(int d, String str) {
    try {
    	if (d > 0) {
    		int count = str.getBytes().length;
        for(int i = 0; i<(d-count); i++) {
        	str = str + " ";
        }
    	}
    }
    catch(Exception e){}
    return str;
  }

  /**
  * value를 숫자인지 check하고 참, 거짓 여부를 return.<br>
  *
  * @param     sVal 입력 String
  * @return    Pattern.matches() 리턴 값.
  * @exception 
  * @see   
  */
  public static boolean checkNumber(String sVal) {
    boolean bool = false;
    bool = Pattern.matches("^[0-9]*$", sVal);

  	return bool;
  }

  /**
  * value를 null인지 check하고 trim하여 return한다.<br>
  *
  * @param     sVal 입력 String
  * @return    sVal이 null이면, ""을 리턴, 아니면, 인자를 trim하여 return
  * @exception 
  * @see   
  */
  public static String checkNull(String sVal) {
  	String sResult = "";

  	if (sVal == null)
  	    return sResult;
  	else
  	    sResult = sVal.trim();

  	return sResult;
  }

  /**
  * value를 숫자인지 check하고 참, 거짓 여부를 return.<br>
  *
  * @param     sVal 입력 String
  * @return    Pattern.matches() 리턴 값.
  * @exception 
  * @see   
  */
  public static boolean checkEmail(String str) {
    boolean bool = false;
    bool = Pattern.matches("^[_0-9a-zA-Z-]+@[0-9a-zA-Z-]+(.[_0-9a-zA-Z-]+)*$", str);
    
    return bool;
  }

  /**
  * value가 true이면 'Y'를 false이면 'N'을 return한다.<br>
  *
  * @param     sVal 입력 String
  * @return    sVal이 true이면 'Y'를 리턴, 아니면 'N'을 return
  * @exception 
  * @see   
  */
  public static String checkBoolean(String sVal) {
  	String sResult = "Y";

  	if (sVal.equals("true"))
  	    return sResult;	
  	else
  	    sResult = "N";

  	return sResult;
  }

  /**
  * value가 'Y'이면 true를 'N'이면 false을 return한다.<br>
  *
  * @param     sVal 입력 String
  * @return    sVal이 'Y'이면 true를 리턴, 아니면 false을 return
  * @exception 
  * @see   
  */
  public static String checkYNtoBoolean(String sVal) {
  	String sResult = "true";

  	if (sVal.equals("Y"))
  	    return sResult;	
  	else
  	    sResult = "false";

  	return sResult;
  }	

  /**
  *  <br>
  * @param     
  * @return
  * @see
  */
  public String getThisYear() {
    Calendar cal = Calendar.getInstance();
    int year = cal.get(Calendar.YEAR);
    
    return String.valueOf(year);
  }

  /**
  *  <br>
  * @param     
  * @return
  * @see
  */
  public String getThisMonth() {
    Calendar cal = Calendar.getInstance();
    int month = cal.get(Calendar.MONTH) + 1;
        
    if (month < 10)
        return "0" + month;
    else
    	return String.valueOf(month);
  }

  /**
  * DB Insert를 위한 한글화를 처리한다.<br>
  *
  * @param     sVal 입력 String
  * @return    euc-kr type으로 변경한 결과를 return
  * @exception 
  * @see   
  */
  public static String toUTF8(String sVal) {
  	String sResult = "";

  	try {
  		if(sVal.length() > 0)
  			sResult = new String( sVal.getBytes("ISO-8859-1"), "UTF-8");
  	} catch (Exception e) {
  			System.out.println("Util toKor Exception " + e);
  	}

  	return sResult;
  }
  
  /**
  * DB Insert를 위한 한글화를 처리한다.<br>
  *
  * @param     sVal 입력 String
  * @return    euc-kr type으로 변경한 결과를 return
  * @exception 
  * @see   
  */
  public static String toKor(String sVal) {
  	String sResult = "";

  	try {
  		if(sVal.length() > 0)
  			sResult = new String( sVal.getBytes("ISO-8859-1"), "EUC-KR");
  	} catch (Exception e) {
  	    System.out.println("Util toKor Exception " + e);
  	}

  	return sResult;
  }

  /**
   * 원본 문자열에 포함된 특정 문자열을 치환
   *
   * @param org 원본데이터
   * @param from 치환될 문자열
   * @param to 치활할 문자열
   *
   * @return 결과값
   */
  public static String replace(String org, String from, String to) {
    int last = 0;
    int next = 0;
    String result = "";
    
    while (true) {
    	next = org.indexOf(from, last);
    	
    	if (next >= 0) {
    		result += (org.substring(last, next) + to);
        last = next + from.length();
    	}
    	else {
    		result += org.substring(last);
    		break;
    	}
    }
    
    return result;
  }

  /**
  * Cookie에 값을 저장한다.<br>
  *
  * @param     req HttpServletRequest
  * @param     res HttpServletResponse
  * @param	 cookieTitle 쿠키 타이틀
  * @param     cookieValue 쿠키 값
  * @return    
  * @exception 
  * @see   
  */
  public static void setCookie(HttpServletRequest req, HttpServletResponse res, String cookieTitle, String cookieValue) {
    try {
        String sValue = new String((new BASE64Encoder()).encode(cookieValue.getBytes()));
        sValue = URLEncoder.encode(sValue, "");
    
        Cookie cook = new Cookie(cookieTitle, sValue);
    /*
    	    String tmpServer = req.getServerName();
    	    String sOs = System.getProperty("os.name");
    
    	    if(sOs.substring(0, 3).equals("Win"))
    		cook.setDomain(tmpServer);
    	    else
    		cook.setDomain(tmpServer.substring(tmpServer.indexOf(".") + 1, tmpServer.length()));
    */
        cook.setPath("/");
        res.addCookie(cook);
    }
    catch(Exception exception) { 
    }
  }

  /**
  * Cookie 값을 가져온다.<br>
  *
  * @param     req HttpServletRequest
  * @param     res HttpServletResponse
  * @param	 cookieTitle 쿠키 타이틀
  * @param     cookieValue 쿠키 값
  * @return    
  * @exception 
  * @see   
  */
  public static String getCookie(HttpServletRequest req, String cookieTitle) {
    String sReturnValue = "";
    Cookie cook[] = req.getCookies();
    String s2;
      
    try {
    	if(cook == null) {
    		String s = "";
        return s;
       }
          
       for(int i = 0; i < cook.length; i++) {
      	 String sCookName = cook[i].getName();
         
      	 if(sCookName.equalsIgnoreCase(cookieTitle)) {
      		 sReturnValue = URLDecoder.decode(cook[i].getValue(), "EUC-KR");
      		 sReturnValue = new String((new BASE64Decoder()).decodeBuffer(sReturnValue));
      	 }
       }
          
      String s1 = sReturnValue;
      return s1;
    }
    catch(Exception e) {
        s2 = sReturnValue;
    }
    return s2;
  }

  	
  /**
  * Cookie의 Detail Item 값을 가져온다.<br>
  * 
  * @param	 psSource 쿠키 타이틀
  * @param     psItem  쿠키 값
  * @return    
  * @exception 
  * @see   
  */
  public static String getCondenseValue(String psSource, String psItem) {
    String sItemNm = "$" + psItem + "=";
    String sItemValue = "";
    int iTmpItemStart = 0;
    int iStartIdx = 0;
    int iEndIdx = 0;
    
    try {
      iTmpItemStart = psSource.indexOf(sItemNm);
      if(iTmpItemStart > -1) {
          iStartIdx = iTmpItemStart + sItemNm.length();
          iEndIdx = psSource.indexOf("$*", iStartIdx);
          sItemValue = psSource.substring(iStartIdx, iEndIdx);
      }
      else {
      	sItemValue = "";
      }
    }
    catch(Exception e) {
    	String s = "";
    	return s;
    }
    
    return sItemValue;
  }

  /**
  * Cookie에 있는 모든 값을 Clear한다.<br>
  *
  * @param     req HttpServletRequest
  * @param     res HttpServletResponse
  * @return    
  * @exception 
  * @see   
  */
  public static void deleteAllCookie(HttpServletRequest request, HttpServletResponse response) {
  	Cookie sCookies[] = request.getCookies();
  	//String sOs = System.getProperty("os.name");
  	//String tmpServer = request.getServerName();
  	 
  	if(sCookies != null) {
  		for(int i = 0; i < sCookies.length; i++) {
    		Cookie cook = sCookies[i];
    		cook.setValue(null);
    		
    		//if(!sOs.substring(0, 3).equals("Win"))
    		//cook.setDomain(tmpServer.substring(tmpServer.indexOf(".") + 1, tmpServer.length()));
    		cook.setPath("/");
    		cook.setMaxAge(0);
    		response.addCookie(cook);
  		}
  	}
  }

  /**
  * 지정된 Cookie 값을 clear한다.<br>
  *
  * @param     req HttpServletRequest
  * @param     res HttpServletResponse
  * @param	 cookieTitle 쿠키 타이틀
  * @return    
  * @exception 
  * @see   
  */
  public static void deleteCookie(HttpServletRequest req, HttpServletResponse res, String cookieTitle) {
    Cookie sCookies[] = req.getCookies();
    //String sOs = System.getProperty("os.name");
    //String tmpServer = req.getServerName();
      			
    if(sCookies != null) {
    	for(int i = 0; i < sCookies.length; i++) {
      	Cookie cook = sCookies[i];
      	String cookName = cook.getName();
      							
      	if(!cookName.equalsIgnoreCase(cookieTitle))
      	    continue;
      							
      	cook.setValue(null);
        							
      	//if(!sOs.substring(0, 3).equals("Win"))
      	//    cook.setDomain(tmpServer.substring(tmpServer.indexOf(".") + 1, tmpServer.length()));

        cook.setPath("/");
        cook.setMaxAge(0);
        res.addCookie(cook);
    	}
    }

  }


}
